package br.com.ruidobrasil.negocio.servico;

import java.util.ArrayList;
import java.util.List;

import com.ibm.icu.text.SimpleDateFormat;

import br.com.ruidobrasil.dto.RetornoDTO;
import br.com.ruidobrasil.negocio.entidade.ImagemPublicacao;
import br.com.ruidobrasil.negocio.entidade.Publicacao;
import br.com.ruidobrasil.negocio.entidade.TipoPublicacao;
import br.com.ruidobrasil.negocio.persistencia.dao.ImagemPublicacaoDao;
import br.com.ruidobrasil.negocio.persistencia.dao.PublicacaoDao;
import br.com.ruidobrasil.negocio.persistencia.dao.RuidoBrasilDaoFactory;
import br.com.ruidobrasil.negocio.persistencia.dao.TipoPublicacaoDao;
import br.com.ruidobrasil.negocio.servico.conversor.RuidoBrasilConversor;
import br.com.ruidobrasil.vo.PublicacaoVO;

public class ServicoPublicacao implements ServicoCrudRuidoBrasil<PublicacaoVO, RetornoDTO>, 
		RuidoBrasilConversor<Publicacao, PublicacaoVO> {
	
	private static final String LISTA = "lista";
	private static final String LISTA_TIPOS_PUBLICACAO = "listaTiposPublicacao";
	private static final String VO = "vo";
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy - HH:mm:ss");
	private static SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
	
	private PublicacaoDao dao = RuidoBrasilDaoFactory.getInstance().criarPublicacaoDao();
	private TipoPublicacaoDao tipoPublicacaoDao = RuidoBrasilDaoFactory.getInstance().criarTipoPublicacaoDao();
	private ImagemPublicacaoDao imagemPublicacaoDao = RuidoBrasilDaoFactory.getInstance().criarImagemPublicacaoDao();
	
	public RetornoDTO obterDadosSelecao() throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
	
		List<TipoPublicacao> tiposPublicacao = tipoPublicacaoDao.listar();
		List<PublicacaoVO> tiposPublicacaoVO = converterTipoPublicacaoEntidadeVO(tiposPublicacao);
		
		dto.dados.put(LISTA_TIPOS_PUBLICACAO, tiposPublicacaoVO);
		
		return dto;
	}
	
	public RetornoDTO obterDados() throws Exception {
		
		RetornoDTO dto = obterDadosSelecao();
		
		return dto;
	}

	public RetornoDTO alterar(PublicacaoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
		
		Publicacao publicacao = converterVOEntidade(vo);
		publicacao = dao.alterar(publicacao);
		
		PublicacaoVO voAlterada = converterEntidadeVO(publicacao);
		
		dto.dados.put(VO, voAlterada);
		
		return dto;
	}

	public RetornoDTO excluir(PublicacaoVO vo) throws Exception {
		
		Publicacao publicacao = converterVOEntidade(vo);
		dao.excluir(publicacao.getIdPublicacao());
		
		return new RetornoDTO();
	}

	public RetornoDTO incluir(PublicacaoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
		
		Publicacao publicacao = converterVOEntidade(vo);
		publicacao = dao.incluir(publicacao);
		
		PublicacaoVO voAlterada = converterEntidadeVO(publicacao);
		
		dto.dados.put(VO, voAlterada);
		
		return dto;
	}

	public RetornoDTO obter(PublicacaoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
			
		Publicacao publicacao = converterVOEntidade(vo);
		publicacao = dao.obter(publicacao.getIdPublicacao());
		
		PublicacaoVO publicacaoVO = converterEntidadeVO(publicacao);
		
		dto.dados.put(VO, publicacaoVO);
		
		return dto;
	}

	public RetornoDTO pesquisar(PublicacaoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
			
		Publicacao filtro = converterVOEntidade(vo);
		List<Publicacao> publicacoes = dao.pesquisar(filtro);
		List<PublicacaoVO> vos = converterEntidadeVO(publicacoes);
		
		dto.dados.put(LISTA, vos);
		
		return dto;
	}
	
	public RetornoDTO obterImagensPublicacao(PublicacaoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
			
		ImagemPublicacao ip = converterVOImagemPublicacao(vo);
		
		List<ImagemPublicacao> listaIp = imagemPublicacaoDao.obterPorIdPublicacao(ip.getPublicacao().getIdPublicacao());
		List<PublicacaoVO> listaVOs = converterImagemPublicacaoEntidadeVO(listaIp);
		
		dto.dados.put(LISTA, listaVOs);
		
		return dto;
	}
	
	public RetornoDTO removerImagem(PublicacaoVO vo) throws Exception {
		
		ImagemPublicacao ip = converterVOImagemPublicacao(vo);
		imagemPublicacaoDao.excluir(ip.getIdImagemPublicacao());
		
		return new RetornoDTO();
	}
	
	public Publicacao converterVOEntidade(PublicacaoVO vo) throws Exception {
		
		Publicacao publicacao = new Publicacao();
		
		publicacao.setIdPublicacao(vo.getIdPublicacao() != null ? Long.parseLong(vo.getIdPublicacao()) : null);
		
		if (vo.getIdTipoPublicacao() != null) {
			TipoPublicacao tipoPublicacao = new TipoPublicacao();
			tipoPublicacao.setIdTipoPublicacao(vo.getIdTipoPublicacao() != null ? Integer.parseInt(vo.getIdTipoPublicacao()) : null);
			publicacao.setTipoPublicacao(tipoPublicacao);
		}
		
		publicacao.setTituloPublicacao(vo.getTituloPublicacao());
		publicacao.setResumoPublicacao(vo.getResumoPublicacao());
		publicacao.setTextoPublicacao(vo.getTextoPublicacao());
		publicacao.setBolAtivo(vo.getBolAtivo() != null ? Boolean.parseBoolean(vo.getBolAtivo()) : null);
		publicacao.setDataHoraCadastro(vo.getDataHoraCadastro() != null ? sdf2.parse(vo.getDataHoraCadastro()) : null);
		
		return publicacao;
	}
	
	public ImagemPublicacao converterVOImagemPublicacao(PublicacaoVO vo) throws Exception {
		
		ImagemPublicacao ip = new ImagemPublicacao();
		ip.setIdImagemPublicacao(vo.getIdImagemPublicacao() != null ? Long.parseLong(vo.getIdImagemPublicacao()) : null);
		
		Publicacao p = new Publicacao();
		
		p.setIdPublicacao(vo.getIdPublicacao() != null ? Long.parseLong(vo.getIdPublicacao()) : null);
		ip.setPublicacao(p);
		
		return ip;
	}
	
	public PublicacaoVO converterEntidadeVO(Publicacao publicacao) throws Exception {
		
		PublicacaoVO vo = new PublicacaoVO();
		
		vo.setIdPublicacao(publicacao.getIdPublicacao().toString());
		vo.setIdTipoPublicacao(publicacao.getTipoPublicacao().getIdTipoPublicacao().toString());
		vo.setDescTipoPublicacao(publicacao.getTipoPublicacao().getDescTipoPublicacao());
		vo.setTituloPublicacao(publicacao.getTituloPublicacao());
		vo.setResumoPublicacao(publicacao.getResumoPublicacao());
		vo.setTextoPublicacao(publicacao.getTextoPublicacao());
		vo.setBolAtivo(publicacao.getBolAtivo().toString());
		vo.setDataHoraCadastro(sdf.format(publicacao.getDataHoraCadastro()));
		
		return vo;
	}
	
	public PublicacaoVO converterEntidadeVO(ImagemPublicacao ip) throws Exception {
		
		PublicacaoVO vo = new PublicacaoVO();
		vo.setImagemPublicacao(ip.getImagemPublicacao());
		
		return vo;
	}
	
	private List<PublicacaoVO> converterEntidadeVO(List<Publicacao> publicacoes) throws Exception {
		
		List<PublicacaoVO> vos = new ArrayList<PublicacaoVO>();
		
		for (Publicacao p : publicacoes) {
			vos.add(converterEntidadeVO(p));
		}
		
		return vos;
	}
	
	public PublicacaoVO converterTipoPublicacaoEntidadeVO(TipoPublicacao tipoPublicacao) throws Exception {
		
		PublicacaoVO vo = new PublicacaoVO();
		
		vo.setIdTipoPublicacao(tipoPublicacao.getIdTipoPublicacao().toString());
		vo.setDescTipoPublicacao(tipoPublicacao.getDescTipoPublicacao());
		
		return vo;
	}
	
	public PublicacaoVO converterImagemPublicacaoEntidadeVO(ImagemPublicacao imagemPublicacao) throws Exception {
		
		PublicacaoVO vo = new PublicacaoVO();
		
		vo.setIdImagemPublicacao(imagemPublicacao.getIdImagemPublicacao().toString());
		vo.setImagemPublicacao(imagemPublicacao.getImagemPublicacao());
		
		return vo;
	}
	
	private List<PublicacaoVO> converterTipoPublicacaoEntidadeVO(List<TipoPublicacao> tiposPublicacao) throws Exception {
		
		List<PublicacaoVO> vos = new ArrayList<PublicacaoVO>();
		
		for (TipoPublicacao tp : tiposPublicacao) {
			vos.add(converterTipoPublicacaoEntidadeVO(tp));
		}
		
		return vos;
	}
	
	public List<PublicacaoVO> converterImagemPublicacaoEntidadeVO(List<ImagemPublicacao> lista) throws Exception {
		
		List<PublicacaoVO> vos = new ArrayList<PublicacaoVO>();
		
		for (ImagemPublicacao ip : lista) {
			vos.add(converterImagemPublicacaoEntidadeVO(ip));
		}
		
		return vos;
	}
}
